package org.wdcode.common.util;

import java.io.InputStream;
import java.net.URL;

import org.wdcode.common.constants.StringConstants;
import org.wdcode.common.exception.CustomRuntimeException;

/**
 * 关于Class的一些操作
 * @author WD
 * @since JDK6
 * @version 1.0 2010-01-20
 */
public final class ClassUtil {
	/**
	 * 尝试加载资源
	 * @param resourceName 资源文件名
	 * @return
	 */
	public final static URL getResource(String resourceName) {
		// 获得资源URL 使用当前线程
		URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
		// 如果获得的资源为null
		if (CommonUtil.isEmpty(url)) {
			// 使用本类加载
			url = ClassUtil.class.getClassLoader().getResource(resourceName);
		}
		// 如果url还为空 做资源的名的判断重新调用方法
		if (CommonUtil.isEmpty(url) && !CommonUtil.isEmpty(resourceName) && (!resourceName.startsWith(StringConstants.BACKSLASH))) {
			return getResource(StringConstants.BACKSLASH + resourceName);
		}
		// 返回资源
		return url;
	}

	/**
	 * 加载类
	 * @param className 类名
	 * @return 获得的类
	 */
	public final static Class<?> loadClass(String className) {
		// 声明类
		Class<?> theClass = null;
		try {
			// 获得类
			theClass = Class.forName(className);
		} catch (ClassNotFoundException e1) {
			try {
				// 当前线程获得类
				theClass = Thread.currentThread().getContextClassLoader().loadClass(className);
			} catch (ClassNotFoundException e2) {
				try {
					// 使用当前类获得类
					theClass = ClassUtil.class.getClassLoader().loadClass(className);
				} catch (ClassNotFoundException e3) {
					throw new CustomRuntimeException(e3);
				}
			}
		}
		// 返回类
		return theClass;
	}

	/**
	 * 加载资源
	 * @param name 资源名
	 * @return 输入流
	 */
	public final static InputStream loadResource(String name) {
		// 声明流
		InputStream in = ClassUtil.class.getResourceAsStream(name);
		// 判断流为空
		if (CommonUtil.isEmpty(in)) {
			// 使用当前线程来加载资源
			in = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
			// 判断流为空
			if (CommonUtil.isEmpty(in)) {
				// 使用当前类来加载资源
				in = ClassUtil.class.getClassLoader().getResourceAsStream(name);
			}
		}
		// 返回流
		return in;
	}

	/**
	 * 私有构造
	 */
	private ClassUtil() {}
}
